/*
 * Auto.cpp
 *
 *  Created on: 02/10/2012
 */

#include "Auto.h"

Auto::Auto(int horasEstacionado, vector<Pipe>* pipesSalidas, vector<Semaforo>* semaforosSalidas):
	horasEstacionado (horasEstacionado),
	pipesSalidas (pipesSalidas),
	semaforosSalidas (semaforosSalidas){

	Log::getInstance()->loguear("Auto: creado.");
}

Auto::~Auto() {
	Log::getInstance()->loguear("Auto: destruido.");
}

void Auto::inicializar(){
	this->bloquearSeniales();
}

/**
 * Metodo que define que las señales SIGINT y SIGTERM se bloquean.
 * El objetivo es que el auto no salga del sleep para manejar estas señales.
 * Las señales SIGINT y SIGTERM las agarra el terminador para finalizar
 * la ejecución correctamente.
 */
void Auto::bloquearSeniales(){
	sigset_t set;
	sigemptyset(&set);
	sigaddset(&set, SIGINT);
	sigaddset(&set, SIGTERM);
	sigprocmask(SIG_BLOCK, &set, NULL);
}

int Auto::getHorasEstacionado() const {
	return horasEstacionado;
}

void Auto::setHorasEstacionado(int horasEstacionado) {
	this->horasEstacionado = horasEstacionado;
}

Ticket Auto::getTicket() const {
	return ticket;
}

void Auto::setTicket(Ticket ticket) {
	this->ticket = ticket;
}

void Auto::estacionar(){
	Log::getInstance()->loguear("Auto: me duermo " + intToString(horasEstacionado) + " segundos.");

	sleep(this->horasEstacionado);
	this->salir();
}

void Auto::salir(){
	int salidaSeleccionada = this->seleccionarSalida();
	
	Log::getInstance()->loguear("Auto: escribo en el pipe de la salida " + intToString(salidaSeleccionada) + ".");

	this->semaforosSalidas->at(salidaSeleccionada).p();
	this->pipesSalidas->at(salidaSeleccionada).escribir(&this->ticket, sizeof(Ticket));
	this->semaforosSalidas->at(salidaSeleccionada).v();
}

int Auto::seleccionarSalida(){
	return this->ticket.getLugarOcupado() % CANTIDAD_SALIDAS;
}
